#include<algorithm>
#include<iostream>
using namespace std;
const double HIGH_VOLTAGE=15.0;
const double LOW_VOLTAGE=-15.0;
//编码函数
int rs232c_encode(double *volts, int volts_size, const char *msg, int size)
{
	if (volts_size < (size * 10) + 1)
	{ // 每个字符需要10个电压值（1起始位+7数据位+1终止位+1空闲位缓冲），加上一个额外的空闲位
		return -1; // 电压数组大小不够
	}
	int index=0;
	volts[index++]=LOW_VOLTAGE;//开头的空闲位
	for(int i=0;i<size;i++)
	{
		char c=msg[i];
		//cout<<"c:"<<c<<endl;
		//开始位
		volts[index++]=HIGH_VOLTAGE;
		//数据位，位小端序
		for(int j=0;j<7;j++)
		{
			volts[index++]=(c&(1<<j))?LOW_VOLTAGE:HIGH_VOLTAGE;//用与运算来判断c的第j位是否为1
		}
		//结束位
		volts[index++]=LOW_VOLTAGE;
		//空闲位
		volts[index++]=LOW_VOLTAGE;
	}
	return index;//返回电压值数量
}
//解码函数
int rs232c_decode(char *msg, int size, const double *volts, int volts_size)
{
	int index=0;
	int msg_index=0;
	for(;index<volts_size&&msg_index<size;)
	{
		for(;index<volts_size;index++)
		{
			if(volts[index++]==LOW_VOLTAGE)break;
		}
		index++;//跳过起始位
		//cout<<"index:"<<index<<endl;
		int c=0;
		for(int j=0;j<7;j++)
		{
			if(volts[index++]==LOW_VOLTAGE)c+=(1<<j);
			//cout<<c<<endl;
		}
		if (volts[index++] != LOW_VOLTAGE) 
		{
			index = volts_size; // 终止位不正确，跳出循环
			break;
		}
		msg[msg_index++]=c;
	}
	return msg_index;
}
int main()
{
	cout<<"请输入字符数：";
	int n;
	cin>>n;//n为字符数,0<n<100
	cout<<"请输入字符：";
	char a[100];
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		cout<<a[i]<<endl;
	}
	double volts[1010];
	rs232c_encode(volts,1010,a,n);
	cout<<"电压值序列为：";
	for(int i=0;i<10*n+1;i++)
		cout<<volts[i]<<" ";
	cout<<endl;
	char msg[100];
	rs232c_decode(msg,n,volts,1010);
	cout<<"上述电压值序列解码为：";
	for(int i=0;i<n;i++)
		cout<<msg[i]<<" ";
	return 0;
}
